Skip to main content

Playwright Zoo Setup for Multi-Domain Testing

This document describes how the Zoo environment is configured to support Playwright testing across multiple domains, specifically for use by both Volpe and Criceto projects.

Overview

The Zoo environment now provides a shared Playwright infrastructure that allows any project (Volpe, Criceto, etc.) to run browser tests against all platform domains using a sidecar architecture.

Architecture

Sidecar Mode

  • Playwright Server: Runs in dedicated container (playwright)
  • Test Clients: Connect via WebSocket (ws://playwright:3000)
  • Browser Execution: Happens in Playwright container with full domain access
  • DNS Resolution: All platform domains configured in Playwright container

Container Setup

# Global environment variables automatically added to ALL services
x-default-environment:
&default-environment
- ZOO_ENV=true

playwright:
image: mcr.microsoft.com/playwright:v1.53.2-jammy
container_name: playwright
ports: ["3000:3000"]
environment:
- ZOO_ENV=true # Automatically added to all services
- PLAYWRIGHT_BROWSERS_PATH=/ms-playwright
- NODE_TLS_REJECT_UNAUTHORIZED=0

criceto:
environment:
- ZOO_ENV=true # Automatically added to all services
- PW_TEST_CONNECT_WS_ENDPOINT=ws://playwright:3000
depends_on: [playwright]

Available Domains for Testing

All platform services are accessible via HTTPS through nginx reverse proxy:

DomainIPService
volpe.localhost172.31.0.20Digital reader application
farfalla.localhost172.31.0.20Core platform backend
castoro.localhost172.31.0.20PDF processing service
coniglio.localhost172.31.0.20Event tracking and analytics
medusa.localhost172.31.0.20Content intake automation
farfalla-integrations.localhost172.31.0.20Integration adapters
farfalla-https-guard.localhost172.31.0.20HTTPS guard service
minio.localhost172.31.0.19Object storage UI
micelio.localhost172.31.0.21Smart CDN proxy
felini.localhost172.31.0.21Legacy proxy
criceto.localhost172.31.0.21Testing toolkit

Usage for Criceto Team

Prerequisites

  1. Start Zoo Environment:

    ./zoo/zoo.sh up
  2. Ensure Required Containers Are Running:

    • nginx (reverse proxy for HTTPS domains)
    • playwright (browser execution server)
    • ✅ Target service containers (farfalla, volpe, etc.)

Install Playwright in Criceto

Already configured! Criceto package.json includes:

{
"devDependencies": {
"@playwright/test": "^1.53.2"
}
}

Create Playwright Configuration

Create playwright.config.js in Criceto project:

import { defineConfig, devices } from '@playwright/test';

// Environment detection
const isCI = !!process.env.CI;
const isSidecar = !!process.env.PW_TEST_CONNECT_WS_ENDPOINT;
const isZoo = !!process.env.ZOO_ENV || isSidecar;

export default defineConfig({
testDir: './tests/playwright',
forbidOnly: isCI,
retries: isCI ? 2 : 0,
timeout: 30 * 1000,

reporter: [
['list'],
['html', { outputFolder: 'tests/playwright/reports/html' }],
['json', { outputFile: 'tests/playwright/reports/results.json' }],
['junit', { outputFile: 'tests/playwright/reports/results.xml' }]
],

use: {
// Auto-detects base URL based on environment
baseURL: isSidecar ? 'https://farfalla.localhost' : 'http://localhost:8000',
ignoreHTTPSErrors: isZoo,
screenshot: 'only-on-failure',
video: 'retain-on-failure',
trace: 'retain-on-failure',
},

projects: [
{
name: 'chromium-desktop',
use: {
...devices['Desktop Chrome'],
viewport: { width: 1280, height: 720 },
// Zoo-specific browser args (applied automatically in Zoo)
...(isZoo && {
launchOptions: {
args: ['--host-resolver-rules=MAP *.localhost 172.31.0.20']
}
})
},
},
{
name: 'mobile-chrome',
use: {
...devices['Pixel 5'],
viewport: { width: 375, height: 812 },
...(isZoo && {
launchOptions: {
args: ['--host-resolver-rules=MAP *.localhost 172.31.0.20']
}
})
},
},
],

// Only start web server when running locally (not in Zoo sidecar mode)
...(isSidecar || isCI ? {} : {
webServer: {
command: 'php artisan serve',
url: 'http://localhost:8000',
reuseExistingServer: true,
timeout: 120 * 1000,
}
}),
});

Example Test Files

Testing Farfalla Platform

// tests/playwright/farfalla.spec.ts
import { test, expect } from '@playwright/test';

test.describe('Farfalla Platform', () => {
test('should load login page', async ({ page }) => {
await page.goto('https://farfalla.localhost/login');
await expect(page.locator('h1')).toContainText('Login');
});

test('should handle authentication', async ({ page }) => {
await page.goto('https://farfalla.localhost/login');
await page.fill('[name="email"]', 'test@example.com');
await page.fill('[name="password"]', 'password');
await page.click('button[type="submit"]');
// Assert successful login...
});
});

Testing Multiple Domains

// tests/playwright/cross-domain.spec.ts
import { test, expect } from '@playwright/test';

const domains = [
{ name: 'Farfalla', url: 'https://farfalla.localhost' },
{ name: 'Volpe', url: 'https://volpe.localhost' },
{ name: 'Minio', url: 'https://minio.localhost' },
];

domains.forEach(({ name, url }) => {
test(`${name} should be accessible`, async ({ page }) => {
await page.goto(url);
await expect(page).toHaveTitle(/.+/); // Should have some title
});
});

Page Object Model Example

// tests/playwright/pages/FarfallaLoginPage.ts
import { Page, expect } from '@playwright/test';

export class FarfallaLoginPage {
constructor(private page: Page) {}

async goto() {
await this.page.goto('https://farfalla.localhost/login');
}

async login(email: string, password: string) {
await this.page.fill('[name="email"]', email);
await this.page.fill('[name="password"]', password);
await this.page.click('button[type="submit"]');
}

async expectLoginSuccess() {
await expect(this.page).toHaveURL(/dashboard/);
}
}

// Usage in test
test('user login flow', async ({ page }) => {
const loginPage = new FarfallaLoginPage(page);
await loginPage.goto();
await loginPage.login('test@example.com', 'password');
await loginPage.expectLoginSuccess();
});

Running Tests

From Criceto Directory

# Run all Playwright tests
zet

# Run Playwright tests specifically
zex npx playwright test

# Run with UI mode for debugging
zex npx playwright test --ui

# Run specific test file
zex npx playwright test tests/playwright/farfalla.spec.ts

# Run with debug mode
zex npx playwright test --debug

Test Organization

criceto/
├── tests/
│ └── playwright/
│ ├── specs/
│ │ ├── farfalla/
│ │ │ ├── auth.spec.ts
│ │ │ ├── storefront.spec.ts
│ │ │ └── admin.spec.ts
│ │ ├── volpe/
│ │ │ ├── reader.spec.ts
│ │ │ └── annotations.spec.ts
│ │ └── cross-platform/
│ │ ├── integration.spec.ts
│ │ └── workflows.spec.ts
│ ├── pages/
│ │ ├── FarfallaLoginPage.ts
│ │ ├── StorefrontPage.ts
│ │ └── ReaderPage.ts
│ ├── utils/
│ │ ├── test-data.ts
│ │ └── helpers.ts
│ └── reports/
│ ├── html/
│ ├── results.json
│ └── results.xml
└── playwright.config.js

Troubleshooting

Common Issues

  1. Tests fail with "net::ERR_CONNECTION_REFUSED"

    • ✅ Ensure nginx container is running: ./zoo/zoo.sh status
    • ✅ Check target service is running (farfalla, volpe, etc.)
  2. Tests fail with "net::ERR_ADDRESS_UNREACHABLE"

    • ✅ Ensure Playwright container is running
    • ✅ Restart containers: ./zoo/zoo.sh restart playwright criceto
  3. Version mismatch errors

    • ✅ All components should use Playwright v1.53.2
    • ✅ Update package.json and run zex npm install
  4. DNS resolution issues

    • ✅ Playwright container auto-configures all domain mappings
    • ✅ Restart if needed: ./zoo/zoo.sh restart playwright

Debug Commands

# Check Zoo container status
./zoo/zoo.sh status

# View Playwright container logs
docker logs playwright

# Test basic connectivity
zex npx playwright test --reporter=verbose

# Check if domains are accessible
curl -k -I https://farfalla.localhost

Environment Variables

When running in Zoo, these are automatically set for all containers:

  • ZOO_ENV=true - Automatically set for ALL services - Identifies Zoo environment

For services that use Playwright (Volpe, Criceto):

  • PW_TEST_CONNECT_WS_ENDPOINT=ws://playwright:3000 - Enables sidecar mode
  • NODE_TLS_REJECT_UNAUTHORIZED=0 - Allows self-signed certificates (Playwright container)

Integration with CI/CD

The same Playwright configuration works in:

  • Local Zoo Environment: Uses sidecar mode
  • GitLab CI: Uses direct container execution
  • Development: Can fallback to local server mode

No code changes needed - environment detection is automatic!

Next Steps for Criceto Team

  1. Create playwright.config.js with the configuration above
  2. Set up test directory structure (tests/playwright/)
  3. Write first test targeting a specific platform domain
  4. Run tests: cd criceto && zet
  5. Iterate and expand test coverage across domains

Support

For issues or questions about the Playwright Zoo setup:

  • Check container status: ./zoo/zoo.sh status
  • View logs: docker logs playwright
  • Restart if needed: ./zoo/zoo.sh restart playwright criceto nginx

Ready to test all platform domains! 🚀

X

Graph View